package com.lixinlei.meetingfilm.consumer.feign;

import com.lixinlei.meetingfilm.consumer.feign.vo.UserModel;
//import com.lixinlei.meetingfilm.feignconf.FeignHelloConf;
import feign.Param;
import feign.RequestLine;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

/**
 * fallback 和 fallbackFactory 选一个用于降级就可以了，这个参数启用的话，就算是 Feign 和 Hystrix 整合了；
 */
@FeignClient(
        // name 填服务名，然后 url 不填，就算是整合了 Ribbon 了
        name = "hello-service-provider",

//        url = "http://localhost:7101",

        path = "/provider",

        // 意思是 Feign 自己生成的接口实现的优先级最高，如果自己写了 ProviderApi 的实现比 Feign 的实现更好，可以在自己的实现上用 @Primary,
        primary = true,

//        fallback = ProviderFallbackAPIImpl.class
        fallbackFactory = FallbackFactoryImpl.class

//        FeignHelloConf.java 的位置一定要在启动类 BackendShowConsumerApplication 的包之外
//        configuration = FeignHelloConf.class

)
public interface ProviderApi {

    /**
     * @RequestParam("message") 无论如何都要加上
     * @param message
     * @return
     */
    @RequestMapping(value = "/sayhello", method = RequestMethod.GET)
    String invokerProviderController(@RequestParam("message") String message);

    @RequestMapping(value = "/{providerId}/sayhello", method = RequestMethod.POST)
    String providerPost(
            @RequestHeader("author") String author,
            @PathVariable("providerId")String providerId,
            @RequestBody UserModel userModel);

    /**
     * feign.Contract.Default(); 的调用方式，知道就好，一般不用；
     * @param message
     * @return
     */
//    @RequestLine("GET /sayhello?message={message}")
//    String invokerProviderController(@Param("message") String message);

}
